// 中间层
package middlewares

import (
	"project/config"
	"project/utils/jwtutil"
	"project/utils/logs"

	"github.com/gin-gonic/gin"
)

func JWTAuth(r *gin.Context) {
	// 1. 除了login和logout之外的所有接口，都要验证请求是否携带token，并且token是否合法
	requestUrl := r.FullPath()
	logs.Info(map[string]interface{}{"请求路径": requestUrl}, "")
	if requestUrl == "/api/auth/login" || requestUrl == "/api/auth/logout" {
		logs.Debug(map[string]interface{}{"请求路径": requestUrl}, "登录和退出不需要验证token")
		/*
			// Next: 不执行该中间件 next后面的语句，等待其他的中间件及路由处理函数后才执行next后面的语句。 先进后出
			// Abort: 直接中断当前中间件所有的代码
		*/
		r.Next()
		return
	}

	returnData := config.NewReturnData()
	// token
	// 其他接口需要验证token，如：http://127.0.0.1:8081/api/test
	// 获取是否携带token
	tokenString := r.Request.Header.Get("Authorization")
	if tokenString == "" {
		// 说明请求没有携带
		returnData.Status = 401
		returnData.Message = "请求未携带Token, 请登录后尝试"
		r.JSON(200, returnData)
		r.Abort()
		return
	}
	// token不为空，要去验证token是否合法
	claims, err := jwtutil.ParseToken(tokenString)
	if err != nil {
		returnData.Status = 401
		returnData.Message = "Token验证未通过"
		r.JSON(200, returnData)
		r.Abort()
		return
	}
	r.Set("claims", claims) // 在当前请求的上下文中存储一个值
	r.Next()
}
